/**
 * @desc 单例模式
 * @param className
 * @returns {*}
 */
const singleton = (className) => {
	// 使用 Proxy 代理自定义类上的原型
	return new Proxy(className.prototype.constructor, {
		// 存储类的唯一实例
		instance: null,
		// 1. 重复使用我们想要转换为单身的任何类
		// 2. 允许为我们想要自定义的任何其他操作提供额外的陷阱
		construct: (target, argumentsList) => {
			// 若存在唯一单例，则直接返回该实例
			if (!this.instance)
				this.instance = new target(...argumentsList);
			return this.instance;
		}
	});
}

class MyClass {
	constructor(msg) {
		this.msg = msg;
	}
	printMsg() {
		console.log(this.msg);
	}
}

// 单例模式的类
MySingletonClass = singleton(MyClass);

const myObj = new MySingletonClass('first');
myObj.printMsg();           // 'first'

// 仍是 myObj 单例
const myObj2 = new MySingletonClass('second');
myObj2.printMsg();           // 'first'
